'use strict';

// 导入表
const { Message, Comment, User } = require('../models');
// 导入工具函数
const auth = require('../utils/auth');

// 封装时间
function getTime(time) {
    let date = new Date(Number(time));
    let y = date.getFullYear();
    let m = date.getMonth() + 1;
    let d = date.getDate();
    let h = date.getHours();
    let mi = date.getMinutes();
    if (m < 10) {
        m = "0" + m;
    }
    if (d < 10) {
        d = "0" + d;
    }
    if (mi < 10) {
        mi = "0" + mi;
    }
    return (y + '-' + m + '-' + d + '-' + h + ':' + mi);
}

// 登陆成功的主页
let home_fn = async (ctx, next) => {
    // 获取登录的用户名
    let username = ctx.session.userName;
    // 所有的用户id
    let userIds = [];
    // 获取所有的说说
    let msgs = JSON.parse(JSON.stringify(await Message.findAll({
        order: [
            ['id', 'desc'] // 将发布的说说倒叙显示
        ],
        limit: 5,
        offset: 0
    })));

    // 查询出来的说说id（如果有分页，则应该是10条说说的id）
    let msgIds = [];

    msgs.forEach(item => {
        // 将每条说说的id都推进msgIds数组里
        msgIds.push(item.id);
        // 将每条说说的用户id都推进userIds数组里
        userIds.push(item.fromUserId);
    });

    // 所有的吐槽（如果有分页，可以根据查询的说说id，来查询对应的所有吐槽）
    let comments = JSON.parse(JSON.stringify(await Comment.findAll({
        where: {
            msgId: msgIds
        }
    })));

    comments.forEach(item => {
        userIds.push(item.fromUserId);
    });

    let userAll = await User.findAll({
        where: {
            id: userIds
        }
    });

    // 遍历所有吐槽，给每一个吐槽的fromUserId加上名称
    comments.forEach(item => {
        let userInfo = userAll.filter(row => {
            return item.fromUserId === row.id;
        })[0];
        item.comUserName = userInfo === undefined ? '匿名用户' : userInfo.username;
        item.createtime = getTime(JSON.parse(item.createAt));
    });

    // 组合说说与吐槽的对应关系
    msgs.forEach(msg => {
        let sayComments = comments.filter(item => {
            return item.msgId === msg.id;
        });
        let userInfo = userAll.filter(row => {
            return msg.fromUserId === row.id;
        })[0];
        msg.msgUserName = userInfo === undefined ? '匿名用户' : userInfo.username;
        msg.comments = sayComments;
        msg.createtime = getTime(JSON.parse(msg.createAt));
    });

    let obj = {
        username: username,
        msgs
    }
    ctx.render('home.html', obj);
};

// 加载更多
let more_fn = async (ctx, next) => {

    let { Page } = ctx.request.query;

    let username = ctx.session.userName;
    // 所有的用户id
    let userIds = [];
    // 获取所有的说说
    let msgs = JSON.parse(JSON.stringify(await Message.findAll({
        order: [
            ['id', 'desc'] // 将发布的说说倒叙显示
        ],
        limit: 5,
        offset: (Page - 1) * 5
    })));

    // 查询出来的说说id（如果有分页，则应该是10条说说的id）
    let msgIds = [];

    msgs.forEach(item => {
        // 将每条说说的id都推进msgIds数组里
        msgIds.push(item.id);
        // 将每条说说的用户id都推进userIds数组里
        userIds.push(item.fromUserId);
    });

    // 所有的吐槽（如果有分页，可以根据查询的说说id，来查询对应的所有吐槽）
    let comments = JSON.parse(JSON.stringify(await Comment.findAll({
        where: {
            msgId: msgIds
        }
    })));

    comments.forEach(item => {
        userIds.push(item.fromUserId);
    });

    let userAll = await User.findAll({
        where: {
            id: userIds
        }
    });

    // 遍历所有吐槽，给每一个吐槽的fromUserId加上名称
    comments.forEach(item => {
        let userInfo = userAll.filter(row => {
            return item.fromUserId === row.id;
        })[0];
        item.comUserName = userInfo === undefined ? '匿名用户' : userInfo.username;
        item.createtime = getTime(JSON.parse(item.createAt));
    });

    // 组合说说与吐槽的对应关系
    msgs.forEach(msg => {
        let sayComments = comments.filter(item => {
            return item.msgId === msg.id;
        });
        let userInfo = userAll.filter(row => {
            return msg.fromUserId === row.id;
        })[0];
        msg.msgUserName = userInfo === undefined ? '匿名用户' : userInfo.username;
        msg.comments = sayComments;
        msg.createtime = getTime(JSON.parse(msg.createAt));
    });

    let obj = {
        username: username,
        msgs
    }
    ctx.render('more.html', obj);
}

// 确认注销的验证判断
let logout_fn = async (ctx, next) => {
    // 将用户的session信息清空
    ctx.session = null;
    ctx.response.body = { code: 200 };
}

// 发布说说
let say_fn = async (ctx, next) => {
    // 获取说说的内容
    let sayMsg = ctx.request.body.sayMsg || '';
    // 获取用户id
    let userId = ctx.session.userId;
    // 往数据库中插入数据
    let say = await Message.create({
        fromUserId: userId,
        content: sayMsg
    });
    // 将内容转化成JSON字符串格式
    let data = JSON.parse(JSON.stringify(say));
    data.createtime = getTime(JSON.parse(say.createAt));
    // 返回信息
    ctx.response.body = { code: 200, data: JSON.stringify(data), msg: '发布说说成功！' };
}

// 发布吐槽
let comment_fn = async (ctx, next) => {
    // 获取吐槽内容
    let commentMsg = ctx.request.body.commentMsg || '';
    // 获取吐槽说说的id
    let msgId = ctx.request.body.msgId || '';
    // 获取用户id
    let fromUserId = ctx.session.userId;
    // 往数据库插入信息
    let comment = await Comment.create({
        fromUserId: fromUserId,
        msgId: msgId,
        content: commentMsg
    });
    // 因为要查找说说的用户信息，所以这里先查询了说说的信息，拿到发表说说的用户的id
    let msg = await Message.findOne({
        where: {
            id: msgId
        }
    });

    let toUserId = msg === undefined ? '0' : msg.fromUserId;

    // 在用户表里查询发表说说的用户的信息和发表评论的用户的信息
    let users = await User.findAll({
        where: {
            id: [fromUserId, toUserId]
        }
    });

    // 根据评论者的id，查询到说说的用户信息
    let fromUserInfo = JSON.parse(JSON.stringify(users.filter(user => {
        return user.id === fromUserId;
    })[0]));

    // 根据发表说说的id，查询到评论的用户信息
    let toUserInfo = JSON.parse(JSON.stringify(users.filter(user => {
        return user.id === toUserId;
    })[0]));

    // 将内容转化成JSON字符串格式
    let data = JSON.parse(JSON.stringify(comment));

    // 将说说的用户名称和评论的用户名称挂载到数据信息里面，返回前端
    data.fromUserName = fromUserInfo.username;
    data.toUserName = toUserInfo.username;
    data.createtime = getTime(JSON.parse(comment.createAt));


    // 返回信息
    ctx.response.body = { code: 200, data: JSON.stringify(data), msg: '吐槽成功' };
}

module.exports = {
    '/': ['get', auth, home_fn],
    '/logout': ['post', logout_fn],
    '/say': ['post', say_fn],
    '/comment': ['post', comment_fn],
    '/more': ['get', more_fn]
}